package main

import (
	"fmt"
	"sync"
	"time"
)

/*
协程间共享变量并发问题
go build -race main.go 查看并发问题

解决方案：
1. 使用sync包提供的共享锁
2. 使用channel

*/

// var mymap = make(map[int]int, 10)
var (
	mymap = make(map[int]int, 10)
	lock  sync.Mutex // 获得一个全局锁
)

func cal(n int) {
	res := 1
	for i := 1; i < n; i++ {
		res *= i
	}
	lock.Lock()
	mymap[n] = res
	lock.Unlock()
}

func main() {
	for i := 1; i < 10; i++ {
		go cal(i)
	}

	time.Sleep(time.Second * 3) // 休眠3秒

	for k, v := range mymap {
		fmt.Println(k, "=", v)
	}
}
